﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows.Forms;
using Noris.Schedule.Support;

namespace Noris.Schedule.UI.Components
{
	/// <summary>
	/// Progress bar s přidanými schopnostmi dělení svého prostoru na sub-segmenty
	/// </summary>
	public class Progress : System.Windows.Forms.ProgressBar
	{
		#region STANDARD
		public Progress()
		{
			this.Minimum = 0;
			this.Maximum = 1000;
			this._ProgressCalc = new ProgressCalc(this._SetPosition);
		}
		#endregion
		#region DIVIDED SEGMENTS
		/// <summary>
		/// Objekt, který slouží jako kalkulátor hodnoty i podle vnořených segmentů
		/// </summary>
		private ProgressCalc _ProgressCalc;
		/// <summary>
		/// Nastaví this.Value na danou hodnotu, v případě potřeby zajistí invokaci (asynchronní).
		/// </summary>
		/// <param name="value"></param>
		private void _SetPosition(decimal position)
		{
			if (this.InvokeRequired)
				this.BeginInvoke(new Action<decimal>(this._SetPosition), position);
			else
				this.Value = this.Minimum + (int)(Math.Round((position * (decimal)(this.Maximum - this.Minimum)), 0));
		}
		#endregion
		#region PROVEDENÍ PROGRESU, TVORBA SEGMENTU
		/// <summary>
		/// Zajistí zobrazení progresu dle daných dat.
		/// Řeší stavy: CallBackProcessState.DoProgress : vyvolá DoProgress(args.Ratio);
		/// CallBackProcessState.CreateSegment : zajistí otevření segmentu pro rozmezí args.FromRatio, args.ToRatio a uložení segmentu do args.ProgrSegment
		/// </summary>
		/// <param name="args"></param>
		public void CallProgress(CallBackTargetArgs args)
		{
			this._ProgressCalc.CallProgress(args);
		}
		#endregion
	}
}
